home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / newsgrp / group93a.txt / 000084_icon-group-sender _Thu Mar 11 09:06:35 1993.msg < prev    next >
Internet Message Format  |  1993-04-21  |  3KB

  1. Received: by cheltenham.cs.arizona.edu; Thu, 11 Mar 1993 13:40:37 MST
  2. Date: Thu, 11 Mar 93 09:06:35 PST
  3. From: alex@laguna.Metaphor.COM (Bob Alexander)
  4. Message-Id: <9303111706.AA08783@laguna.Metaphor.COM>
  5. To: icon-group@cs.arizona.edu
  6. Subject: Re: Icon :-> C | ADA translator wanted.
  7. Status: R
  8. Errors-To: icon-group-errors@cs.arizona.edu
  9.  
  10. The ultimate Icon to C translation is performed by the Icon optimizing
  11. compiler.  However, as amazing as it is, the C it produces is not
  12. something you would likely ever want to attempt to maintain as C code.
  13.  
  14. I've written several programs in Icon that I have later converted to C
  15. for one reason or another (usually not speed, though), and found that
  16. often it is often reasonable to just hand-change the various Icon
  17. algorithms into C.  But there are certain parts of that job that are
  18. very annoying and have to be done over and over, like changing ":=" to
  19. "=".  So I wrote a little filter (in Icon, of course) that performs
  20. some of the mundane tasks of hand-converting Icon to C.
  21.  
  22. It's pretty small, so I'm attaching it to this message.  Maybe this will
  23. prove useful to someone.
  24.  
  25. I have a similar little filter that converts in the other direction --
  26. if anyone is interested let me know.
  27.  
  28. -- Bob Alexander
  29.  
  30. Metaphor Inc.                 (415) 966-0751      alex@metaphor.com
  31. ====^=== Mountain View, CA  ...{uunet}!{decwrl,apple}!metaphor!alex
  32.  
  33. -------------------------- icn2c.icn -----------------------------------
  34.  
  35. #
  36. #  Program to do some mundane aspects of conversion of Icon to C.
  37. #
  38. #  - Reformats comments
  39. #  - Reformats line-continued strings
  40. #  - Changes := to =
  41. #  - Reformats procedure declarations
  42. #  - Changes end to "}"
  43. #
  44.  
  45. procedure main(arg)
  46.   parenLevel := 0
  47.   while line := trim(read(),' \t') do line ? {
  48.     line := comment := suffix := ""
  49.     ="procedure" & tab(many(' \t')) & suffix := " {"
  50.     ="end" & tab(many(' \t')) | pos(0) & line ||:= "}"
  51.     while line ||:= tab(upto('\'":#')) do {
  52.       case c := move(1) of {
  53.     "\"" | "'": {
  54.       #
  55.       #  Handle character strings.
  56.       #
  57.       line ||:= c
  58.       repeat {
  59.         until line ||:= tab(find(c) + 1) do {
  60.           line ||:= tab(0)
  61.           if line[-1] == "_" then line[-1] := "\""
  62.           else stop("unbalanced quotes")
  63.           Out(line)
  64.           line := ""
  65.           &subject := read()
  66.           line := (tab(many(' \t')) | "") || "\""
  67.         }
  68.         if not (line[-2] == "\\" & not (line[-3] == "\\")) then break
  69.       }
  70.     }
  71.     "#": {
  72.       #
  73.       #  Handle comments.
  74.       #
  75.       comment := trim(tab(0),' \t')
  76.     }
  77.     ":": {
  78.       #
  79.       #  Change := to =
  80.       #
  81.       if ="=" then line ||:= "="
  82.       else line ||:= c
  83.     }
  84.     "(": {
  85.       parenLevel +:= 1
  86.       line ||:= c
  87.     }
  88.     ")": {
  89.       parenLevel -:= 1
  90.       line ||:= c
  91.     }
  92.         default: line ||:= c
  93.       }
  94.     }
  95.     line ||:= tab(0) || suffix
  96.     tline := trim(line,' \t')
  97.     if not (parenLevel > 0 | *tline = 0 |
  98.     any('{}(!%&*+,-./:<=>?@\\^',tline,-1) |
  99.     (tline[-4:0] == ("else" | "then") &
  100.     not tline[-5] | any(' \t',tline[-5]))) then {
  101.       line := tline || ";" || line[*tline + 1:0]
  102.     }
  103.     Out(line,comment)
  104.   }
  105. end
  106.  
  107.  
  108. procedure Out(line,comment)
  109.   line ||:= "/*" || ("" ~== \comment) || " */"
  110.   line := trim(line,' \t')
  111.   write(line)
  112.   return
  113. end
  114.